package com.wichatbackapi.config;

import com.wichatbackapi.result.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.EOFException;


//@ControllerAdvice//将提供全局的异常处理、数据绑定和模型属性处理等功能
@Slf4j
@Configuration
public class GlobalExceptionHandler {//全局异常处理器

    @ResponseBody//返回json对象
    @ExceptionHandler(UsernameNotFoundException.class)//处理springSecurity中用户名找不到的异常
    public ResponseResult handleUsernameNotFoundException(UsernameNotFoundException e) {
        // 处理异常逻辑，例如记录日志等
        // 记录日志
        log.error("用户名异常发生: ", e);//即用户名在数据库中找不到的情况
        // 返回错误信息
        return new ResponseResult(402, "账号不存在或账号被禁用！");//前端页面返回的信息
    }
    @ResponseBody//返回json对象
    @ExceptionHandler(AuthenticationException.class)//处理springSecurity中用户名找不到的异常
    public ResponseResult handleAuthenticationException(AuthenticationException e) {//用户认证异常
        // 处理异常逻辑，例如记录日志等
        // 记录日志
        log.error("认证异常发生: ", e);//即秘密与数据库密码比对出错的情况
        // 返回错误信息
        return new ResponseResult(402, "密码错误！");//前端页面返回的信息
    }
    @ResponseBody//返回json对象
    @ExceptionHandler(EOFException.class)//处理输入流的异常
    public ResponseResult handleIOException(EOFException e) {//用户认证异常
        // 处理异常逻辑，例如记录日志等
        // 记录日志
        log.error("Io流异常---------: ", e);//即秘密与数据库密码比对出错的情况
        if(e.getMessage()=="bad token"){//如果是bad token，则是非法token
            // 返回错误信息
//            return new ResponseResult(405, "token非法！");//前端页面返回的信息
            return new ResponseResult(401,"无效的token，或者token已过期，请重新登录。");
        }
        if(e.getMessage()=="noLogin"){//如果是noLogin，则是未登录状态
            return new ResponseResult(401,"用户未登录");
        }
        // 返回错误信息
        return new ResponseResult(500, e.getMessage());//前端页面返回的信息
    }
    @ResponseBody//返回json对象
    @ExceptionHandler(RuntimeException.class)//处理运行时的异常
    public ResponseResult runtimeException(RuntimeException e) {//运行时异常
        // 处理异常逻辑，例如记录日志等
        // 记录日志
        log.error("运行时异常: ", e);//即秘密与数据库密码比对出错的情况
        // 返回错误信息
        return new ResponseResult(500, e.getMessage());//前端页面返回的信息
    }

}
